package com.spring.mvc.controller;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.spring.mvc.bean.DireccionResponse;
import com.spring.mvc.bean.PadronRucResponse;
import com.spring.mvc.bean.RucCandidatosBean;
import com.spring.mvc.bean.T0003maesDire;
import com.spring.mvc.bean.T0008maesDepa;
import com.spring.mvc.bean.T0009maesProv;
import com.spring.mvc.bean.T0010maesDist;
import com.spring.mvc.bean.UbigeoBean;
import com.spring.mvc.service.DireccionService;
@Controller("consultaPadronRucController")
@Scope("session")
public class ConsultaPadronRucController {
	
  private List<PadronRucResponse> listaRuc=new ArrayList<PadronRucResponse>();

  private T0008maesDepa depa=new T0008maesDepa();
  private T0009maesProv provicia=new T0009maesProv();
  private T0010maesDist distrito=new T0010maesDist();
  private String direccion;
  private String precision;
  private List<T0003maesDire> listaDirecPadron;
  
  //lista ayuda asistida
  private List<DireccionResponse> listaDirecconResponse;
  @Value( "${url_web_ruc}" )  
  private String uri;
  //public final static String uri="http://192.168.1.36:7001/sunat/address/find";
  @Value( "${url_web_direc}" )  
  private String uri_direc;
  @Autowired
  private DireccionService direccionService;

	public void ini(){
    	if(listaRuc.isEmpty()){
           // FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"", "No se encontraron elementos!"));
        }    	
    }
	public List<PadronRucResponse> getListaRuc() {
		return listaRuc;
	}
	public void setListaRuc(List<PadronRucResponse> listaRuc) {
		this.listaRuc = listaRuc;
	}
	

	public void buscar(){
		System.out.println("buscar");
		String ubigeo=null;
		StringBuilder cadenaJson=new StringBuilder();
		UbigeoBean ubigeoBean=null;
		if(direccion!=null && direccion.length()>0){
			cadenaJson.append("{");
			cadenaJson.append("\"direcciones\":");
			cadenaJson.append("[");
				ubigeo=depa.getCodDepa()+provicia.getCodProv()+distrito.getCodDist();
				ubigeoBean=direccionService.selectUbigeo(ubigeo);
				if(ubigeoBean!=null){
					cadenaJson.append("{");
					cadenaJson.append("\"Direccion Original\":").append("\"").append(direccion).append("\",\n");
					cadenaJson.append("\"Departamento\":").append("\"").append(ubigeoBean.getNomDepa().trim()).append("\",\n");
					cadenaJson.append("\"Provincia\":").append("\"").append(ubigeoBean.getNomProvincia().trim()).append("\",\n");
					cadenaJson.append("\"Distrito\":").append("\"").append(ubigeoBean.getNomDistrito().trim()).append("\",\n");
					cadenaJson.append("\"Precision\":").append("\"").append(precision).append("\"\n");
					cadenaJson.append("}").append("\n");
				}				
			
			cadenaJson.append("]\n");
			cadenaJson.append("}");
		}
		//llamar al servicio
		if(cadenaJson.toString().length()>0){
			try {
				JSONObject jsonEntrada = new JSONObject(cadenaJson.toString());
		                URL url = new URL(uri);
		                URLConnection connection = url.openConnection();
		                connection.setDoOutput(true);
		                connection.setRequestProperty("Content-Type", "application/json");
		                connection.setConnectTimeout(5000);
		                connection.setReadTimeout(5000);
		                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
		                out.write(jsonEntrada.toString());
		                out.close();		 
		                BufferedReader in = new BufferedReader(new InputStreamReader(
		                        connection.getInputStream()));
		                String salida =in.readLine();
		                if(salida!=null && salida.length()>0){
		                	JSONObject jsonSalida = new JSONObject(salida);
		                	JSONArray listaResul=jsonSalida.getJSONArray("direcciones");
		                	JSONObject dire=null;
		                	JSONObject jsonRucCandidatos=null;
		                	JSONArray listaRucCandi=null;
		                	PadronRucResponse direccionNormalizada=null;
		                	if(listaResul!=null && listaResul.length()>0){
		                		//for (int i = 0; i < listaResul.length(); i++) {
		                			dire=listaResul.getJSONObject(0);
		                			//jsonRucCandidatos=(JSONObject) dire.get("RUC Candidatos");
		                			
		                			listaRucCandi=dire.getJSONArray("RUC Candidatos");
		                			List<RucCandidatosBean> listRucRespuesta=null;
		                			//RucCandidatosBean rucBean=null;
		                			direccionNormalizada=new PadronRucResponse();	
		                			direccionNormalizada.setDirecOriginal(dire.getString("Direccion Original"));
		                			direccionNormalizada.setUbigeoBean(new UbigeoBean());
		                			direccionNormalizada.getUbigeoBean().setNomDepa(dire.getString("Departamento"));
		                			direccionNormalizada.getUbigeoBean().setNomProvincia(dire.getString("Provincia"));
		                			direccionNormalizada.getUbigeoBean().setNomDistrito(dire.getString("Distrito"));
		                			direccionNormalizada.setPrecision(dire.get("Presicion").toString());
		                			if(listaRucCandi!=null && listaRucCandi.length()>0){
		                				listRucRespuesta=new ArrayList<RucCandidatosBean>();
		                				for (int j = 0; j < listaRucCandi.length(); j++) {
		                					jsonRucCandidatos=listaRucCandi.getJSONObject(j);
		                					if(jsonRucCandidatos.get("RUC")==null){
		                					direccionNormalizada.setRuc(jsonRucCandidatos.getString("RUC"));
		                					}else direccionNormalizada.setRuc("");
		                					direccionNormalizada.setTipoVia(jsonRucCandidatos.getString("Tipo Via"));
		                					direccionNormalizada.setNomVia(jsonRucCandidatos.getString("Nombre Via"));
		                					direccionNormalizada.setUbigeo(jsonRucCandidatos.getString("Ubigeo"));
		                					direccionNormalizada.setPosiLati(jsonRucCandidatos.get("posi_lati").toString());
		                					direccionNormalizada.setPosiLong(jsonRucCandidatos.get("posi_long").toString());			                				
		                					listaRuc.add(direccionNormalizada);			
										}             				

		                			}else{
		                				listaRuc.add(direccionNormalizada);	
		                			}
		                			
								//}
		                	}          	
		                	
		                	
		                	
		                }
		                System.out.println("\nREST Service Invoked Successfully..");
		                in.close();
				
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
	//uso web services
	public List<String> filtraDireccion(String direcionParan){
		String ubigeo=null;
		List<String> resul=null;
		if(depa!=null && provicia!=null && distrito!=null){
			try{
				ubigeo=depa.getCodDepa().trim()+provicia.getCodProv().trim()+distrito.getCodDist().trim();
				//implementar web services
				StringBuilder cadenaJsonImput=new StringBuilder();
				cadenaJsonImput.append("{");
				cadenaJsonImput.append("\"ubigeo\":").append("\"").append(ubigeo).append("\",\n");
				cadenaJsonImput.append("\"paranbusqueda\":").append("\"").append(direcionParan).append("\"\n");
				cadenaJsonImput.append("}");
				//llamar al servicio
				if(cadenaJsonImput.toString().length()>0){
					 URL url = new URL(uri_direc);
		                URLConnection connection = url.openConnection();
		                connection.setDoOutput(true);
		                connection.setRequestProperty("Content-Type", "application/json");
		                connection.setConnectTimeout(5000);
		                connection.setReadTimeout(5000);
		                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
		                out.write(cadenaJsonImput.toString());
		                out.close();		 
		                BufferedReader in = new BufferedReader(new InputStreamReader(
		                        connection.getInputStream()));
		                String salida =in.readLine();
		                JSONArray listaSugerencias=null;
		                if(salida!=null){
		                	resul=new ArrayList<String>();
		                	JSONObject jsonSalida = new JSONObject(salida);
		                	DireccionResponse direccionResponse=null;
		                	JSONObject jsonDirec=null;
		                	listaSugerencias=jsonSalida.getJSONArray("Lista de Sugerencias");
		                	if(listaSugerencias!=null && listaSugerencias.length()>0){
		                		for (int i = 0; i < listaSugerencias.length(); i++) {
		                			jsonDirec=listaSugerencias.getJSONObject(i);
		                			direccionResponse=new DireccionResponse();
		                			direccionResponse.setCodDepa(jsonDirec.getString("codDepa"));
		                			direccionResponse.setCodProv(jsonDirec.getString("codProv"));
		                			direccionResponse.setCodeDist(jsonDirec.getString("codeDist"));
		                			direccionResponse.setNomVia(jsonDirec.getString("nomVia"));
		                			resul.add(jsonDirec.getString("nomVia"));
		                			//listaDirecconResponse.add(direccionResponse);
								}
		                	}
		                	
		                	
		                	
		                	
		                }
				}
			}catch(Exception exception){
				
			}

//			try {
//				listaDirecPadron=direccionService.selectAllDireccion(ubigeo, direcionParan);
//				if(listaDirecPadron!=null && listaDirecPadron.size()>0){
//					resul=new ArrayList<String>();
//					for (int i = 0; i < listaDirecPadron.size(); i++) {						
//						resul.add(listaDirecPadron.get(i).getCodTipoVia()+" "+listaDirecPadron.get(i).getNomVia());
//					}
//				}
//			} catch (Exception e) {
//			
//				e.printStackTrace();
//			}
			
		}
		return resul;
		
	}
	public List<T0003maesDire> getListaDirecPadron() {
		return listaDirecPadron;
	}

	public void setListaDirecPadron(List<T0003maesDire> listaDirecPadron) {
		this.listaDirecPadron = listaDirecPadron;
	}

	public void verDirecionesBatch(){
		
	}

	public T0008maesDepa getDepa() {
		return depa;
	}

	public void setDepa(T0008maesDepa depa) {
		this.depa = depa;
	}

	public T0009maesProv getProvicia() {
		return provicia;
	}

	public void setProvicia(T0009maesProv provicia) {
		this.provicia = provicia;
	}

	public T0010maesDist getDistrito() {
		return distrito;
	}

	public void setDistrito(T0010maesDist distrito) {
		this.distrito = distrito;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getPrecision() {
		return precision;
	}
	public void setPrecision(String precision) {
		this.precision = precision;
	}
	public List<DireccionResponse> getListaDirecconResponse() {
		return listaDirecconResponse;
	}
	public void setListaDirecconResponse(
			List<DireccionResponse> listaDirecconResponse) {
		this.listaDirecconResponse = listaDirecconResponse;
	}
	
}
